package main

import "fmt"

var name = "World"

/**
全局变量

看到191页(函数的defer)
*/
var FunGlo = func(a int, b int) int {
	return a * b
}

/**
看到:6.16,第184页
*/
func main() {
	fmt.Println("Hello, World!name:", name)

	fmt.Println("==匿名函数的测试==")
	annoRes := func(a int, b int) int {
		return a + b
	}(10, 20)
	fmt.Println("匿名函数:annoRes:", annoRes)

	/* 将匿名函数赋值给一个变量 */
	var annoParam = func(a int, b int) int {
		return a + b
	}

	var res1 = annoParam(10, 20)
	fmt.Println("匿名函数:res1:", res1)
	var res2 = annoParam(10, 30)
	fmt.Println("匿名函数:res2:", res2)

	var gloParam = FunGlo(20, 30)
	fmt.Println("全局匿名函数:gloParam:", gloParam)

	/* 闭包的演示 */
	var biBao = AddUpper()
	fmt.Println("==闭包演示:==", biBao(100))
	fmt.Println("==闭包演示:==", biBao(200))
	fmt.Println("==闭包演示:==", biBao(300))

	fmt.Println("==函数defer==")
	var result = FunDefer(100, 200)
	fmt.Println("==函数defer==结果:", result)
}

func FunDefer(a int, b int) int {
	defer fmt.Println("ok1===a", a)
	defer fmt.Println("ok2===b", b)

	var res = a + b
	fmt.Printf("=====函数内部;a的值为:%v,b的值为:%v==和为:%v===\n", a, b, res)
	return res
}

/*
方法的返回值是一个函数
*/
func AddUpper() func(int) int {
	/* n是全局变量,已经相加,并且会保存 */
	var n = 10
	return func(x int) int {
		/* n是全局变量,已经相加,并且会保存 */
		fmt.Printf("==函数内部;n的值为:%v,x的值为:%v==\n", n, x)
		n = n + x
		return n
	}
}

/**
初始化函数，在main之前执行
*/
func init() {
	fmt.Println("init初始化函数, name:", name)
	name = "Golang"
}
